/**
 * 时区工具函数
 * 用于处理时区转换和显示
 */

/**
 * 获取用户当前时区
 */
export const getUserTimezone = (): string => {
  try {
    return Intl.DateTimeFormat().resolvedOptions().timeZone;
  } catch (error) {
    console.error('获取用户时区失败:', error);
    return 'UTC';
  }
};

/**
 * 获取用户当前时区偏移量
 */
export const getTimezoneOffset = (): string => {
  try {
    const offset = new Date().getTimezoneOffset();
    const hours = Math.floor(Math.abs(offset) / 60);
    const minutes = Math.abs(offset) % 60;
    const sign = offset <= 0 ? '+' : '-';
    return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
  } catch (error) {
    console.error('获取时区偏移量失败:', error);
    return '+00:00';
  }
};

/**
 * 格式化时间显示（根据用户时区）
 * @param utcTime UTC时间字符串
 * @param format 格式化选项
 * @returns 格式化后的时间字符串
 */
export const formatTimeByUserTimezone = (
  utcTime: string | Date | null | undefined,
  format: 'datetime' | 'date' | 'time' = 'datetime'
): string => {
  if (!utcTime) return '-';
  
  try {
    const date = new Date(utcTime);
    if (isNaN(date.getTime())) return '-';
    
    const userTimezone = getUserTimezone();
    
    const options: Intl.DateTimeFormatOptions = {
      timeZone: userTimezone,
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
      hour: '2-digit',
      minute: '2-digit',
      // second: '2-digit',
      hour12: false
    };
    
    // 根据format参数调整显示格式
    switch (format) {
      case 'date':
        delete options.hour;
        delete options.minute;
        delete options.second;
        break;
      case 'time':
        delete options.year;
        delete options.month;
        delete options.day;
        break;
    }
    
    // 使用英文格式，确保与图片中的格式一致：YYYY-MM-DD HH:mm
    return date.toLocaleString('en-CA', options).replace(',', '');
  } catch (error) {
    console.error('时区转换失败:', error);
    return String(utcTime);
  }
};

/**
 * 获取当前时间（用户时区）
 */
export const getCurrentTime = (): string => {
  try {
    const userTimezone = getUserTimezone();
    return new Date().toLocaleString('zh-CN', {
      timeZone: userTimezone,
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
      hour: '2-digit',
      minute: '2-digit',
      // second: '2-digit',
      hour12: false
    });
  } catch (error) {
    console.error('获取当前时间失败:', error);
    return new Date().toLocaleString();
  }
};

/**
 * 获取时区显示名称
 */
export const getTimezoneDisplayName = (): string => {
  try {
    const timezone = getUserTimezone();
    const offset = getTimezoneOffset();
    return `${timezone} (UTC${offset})`;
  } catch (error) {
    console.error('获取时区显示名称失败:', error);
    return 'UTC';
  }
};

/**
 * 时区映射表（常用时区）
 */
export const TIMEZONE_MAP: Record<string, string> = {
  'Asia/Shanghai': '中国标准时间',
  'Asia/Tokyo': '日本标准时间',
  'Asia/Seoul': '韩国标准时间',
  'Europe/Berlin': '中欧时间',
  'Europe/London': '格林威治标准时间',
  'America/New_York': '美国东部时间',
  'America/Los_Angeles': '美国西部时间',
  'Australia/Sydney': '澳大利亚东部时间',
  'UTC': '协调世界时'
};

/**
 * 获取时区中文名称
 */
export const getTimezoneChineseName = (timezone?: string): string => {
  const tz = timezone || getUserTimezone();
  return TIMEZONE_MAP[tz] || tz;
};
